#ifndef DB_TABLE_CONFIG_H
#define DB_TABLE_CONFIG_H

#include <QString>
#include <QStringList>
#include <QMap>

/**
 * @brief 数据库表名及SQL语句静态配置
 * 与实体类字段保持一致，包含所有表名定义和对应的建表SQL语句
 * 注：采用逻辑外键关联，不创建物理外键约束
 */
namespace DBTableConfig {

// 所有数据库表名定义（下划线命名风格）
const QString MATERIAL_TABLE = "materials";               // 物料表
const QString USER_TABLE = "users";                       // 用户表
const QString WAREHOUSE_TABLE = "warehouses";             // 仓库表
const QString SHELF_TABLE = "shelves";                    // 货架表
const QString INVENTORY_TABLE = "inventory";              // 库存表
const QString WAREHOUSE_PERMISSION_TABLE = "warehouse_permissions";  // 仓库权限表
const QString OPERATION_LOG_TABLE = "operation_logs";     // 操作日志表
const QString ERROR_LOG_TABLE = "error_logs";             // 错误日志表
const QString SYSTEM_LOG_TABLE = "system_logs";           // 系统日志表

/**
 * @brief 获取所有表名列表
 * @return 包含所有表名的QStringList
 */
inline QStringList getAllTableNames() {
    return {
        MATERIAL_TABLE,
        USER_TABLE,
        WAREHOUSE_TABLE,
        SHELF_TABLE,
        INVENTORY_TABLE,
        WAREHOUSE_PERMISSION_TABLE,
        OPERATION_LOG_TABLE,
        ERROR_LOG_TABLE,
        SYSTEM_LOG_TABLE
    };
}

/**
 * @brief 获取指定表的建表SQL语句
 * @param tableName 表名
 * @return 建表SQL语句（不含物理外键约束）
 */
inline QString getCreateTableSql(const QString& tableName) {
    static const QMap<QString, QString> tableSqlMap = {
        // 物料表：与Material类对应
        {MATERIAL_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                material_name TEXT NOT NULL,  -- 与实体类material_name对应
                model TEXT,                   -- 型号
                image TEXT,                   -- 图片路径
                material_quantity INTEGER DEFAULT 0,  -- 与实体类material_quantity对应
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
            )
        )").arg(MATERIAL_TABLE)},

        // 用户表：与User类对应
        {USER_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT NOT NULL,       -- 与实体类username对应
                email TEXT UNIQUE NOT NULL,   -- 邮箱
                password TEXT NOT NULL,       -- 密码（加密存储）
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
            )
        )").arg(USER_TABLE)},

        // 仓库表
        {WAREHOUSE_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                warehouse_name TEXT NOT NULL UNIQUE,    -- 仓库名称
                warehouse_quantity INTEGER DEFAULT 0,  -- 总库存数量
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
            )
        )").arg(WAREHOUSE_TABLE)},

        // 货架表（逻辑关联仓库表id）
        {SHELF_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                warehouse_id INTEGER NOT NULL,  -- 逻辑关联仓库表id
                shelf_name TEXT NOT NULL,             -- 货架名称
                shelf_quantity INTEGER DEFAULT 0,      -- 货架库存数量
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
                -- 移除物理外键约束，保留逻辑关联
            )
        )").arg(SHELF_TABLE)},

        // 库存表（逻辑关联仓库、货架、物料表）
        {INVENTORY_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                warehouse_id INTEGER NOT NULL,   -- 逻辑关联仓库表id
                shelf_id INTEGER NOT NULL,       -- 逻辑关联货架表id
                material_id INTEGER NOT NULL,    -- 逻辑关联物料表id
                inventory_quantity INTEGER NOT NULL DEFAULT 0,  -- 库存数量
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                UNIQUE(warehouse_id, shelf_id, material_id)  -- 联合唯一约束
                -- 移除物理外键约束，保留逻辑关联
            )
        )").arg(INVENTORY_TABLE)},

        // 仓库权限表：与WarehousePermission类对应（逻辑关联用户和仓库表）
        {WAREHOUSE_PERMISSION_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER NOT NULL,        -- 逻辑关联用户表id，与实体类user_id对应
                warehouse_id INTEGER NOT NULL,   -- 逻辑关联仓库表id，与实体类warehouse_id对应
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                UNIQUE(user_id, warehouse_id)    -- 联合唯一约束
                -- 移除物理外键约束，保留逻辑关联
            )
        )").arg(WAREHOUSE_PERMISSION_TABLE)},

        // 操作日志表：与OperationLog类对应（逻辑关联用户表）
        {OPERATION_LOG_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER,                 -- 逻辑关联用户表id（允许为NULL）
                oper_user TEXT NOT NULL,         -- 与实体类oper_user对应
                oper_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,  -- 与实体类oper_time对应
                oper_result TEXT NOT NULL,       -- 与实体类oper_result对应
                module TEXT NOT NULL,            -- 与实体类module对应
                content TEXT NOT NULL            -- 与实体类content对应
                -- 移除物理外键约束，保留逻辑关联
            )
        )").arg(OPERATION_LOG_TABLE)},

        // 错误日志表：与ErrorLog类对应（逻辑关联用户表）
        {ERROR_LOG_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER,                 -- 逻辑关联用户表id（允许为NULL）
                oper_user TEXT NOT NULL,         -- 与实体类oper_user对应
                oper_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,  -- 与实体类oper_time对应
                oper_result TEXT NOT NULL,       -- 与实体类oper_result对应
                error_detail TEXT NOT NULL,      -- 与实体类error_detail对应
                error_location TEXT NOT NULL     -- 与实体类error_location对应
                -- 移除物理外键约束，保留逻辑关联
            )
        )").arg(ERROR_LOG_TABLE)},

        // 系统日志表
        {SYSTEM_LOG_TABLE, QString(R"(
            CREATE TABLE IF NOT EXISTS %1 (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                system_info TEXT NOT NULL,       -- 系统信息
                log_type TEXT NOT NULL,          -- 日志类型
                response_result TEXT,            -- 响应结果
                create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
            )
        )").arg(SYSTEM_LOG_TABLE)}
    };

    return tableSqlMap.value(tableName);
}

/**
 * @brief 获取所有表的建表SQL语句
 * @return 表名到建表SQL的映射
 */
inline QMap<QString, QString> getAllCreateTableSql() {
    QMap<QString, QString> sqlMap;
    for (const QString& tableName : getAllTableNames()) {
        sqlMap[tableName] = getCreateTableSql(tableName);
    }
    return sqlMap;
}

} // namespace DBTableConfig

#endif // DB_TABLE_CONFIG_H
